package ar.uba.fi.algo3.tests;

import junit.framework.TestCase;

import org.junit.Test;

import ar.uba.fi.algo3.auxiliares.*;
import ar.uba.fi.algo3.modelo.CampoBatalla;
import ar.uba.fi.algo3.modelo.astillero.*;
import ar.uba.fi.algo3.modelo.disparo.*;
import ar.uba.fi.algo3.modelo.nave.Nave;

public class ImpactoMinaTripleConRetardoTest  extends TestCase {
	
	public CampoBatalla campoBatalla;
	public Disparo unDisparo;
	public Direccion direccion;
	public Astillero fabrica;
	
	@Test
	public void testMinaTripleALancha(){
		 
		campoBatalla= new CampoBatalla();
		unDisparo= new MinaSubmarinaTripleConRetardo(new Posicion (4,6), campoBatalla);
		direccion= new DireccionDerecha();
		fabrica= new AstilleroDeLanchas();
		campoBatalla.insertarAlCampo(unDisparo);
		Nave unaLancha= fabrica.crearNaveEn(new Posicion(0,5), campoBatalla, direccion);
		campoBatalla.insertarAlCampo(unaLancha);
		
		assertEquals(unaLancha.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unaLancha.obtenerComponentes().get(1).getDureza(),1);
		
		assertEquals(unDisparo.sigueFuncionando(),true);
		 
		unaLancha.tocaA(unDisparo);

		assertEquals(unaLancha.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unaLancha.obtenerComponentes().get(1).getDureza(),1);		
      
		assertEquals(unDisparo.sigueFuncionando(),true); 
		
		campoBatalla.pasoUnTurno();

		assertEquals(unaLancha.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unaLancha.obtenerComponentes().get(1).getDureza(),1);		
      
		assertEquals(unDisparo.sigueFuncionando(),true);
		
		campoBatalla.pasoUnTurno();

		assertEquals(unaLancha.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unaLancha.obtenerComponentes().get(1).getDureza(),1);		
      
		assertEquals(unDisparo.sigueFuncionando(),true);
		
		campoBatalla.pasoUnTurno();

		assertEquals(unaLancha.obtenerComponentes().get(0).getDureza(),0);
		assertEquals(unaLancha.obtenerComponentes().get(1).getDureza(),0);		
      
		assertEquals(unDisparo.sigueFuncionando(),false);			
	}
	
	@Test
	public void testMinaTripleADestructor(){
		
		campoBatalla= new CampoBatalla();
		unDisparo= new MinaSubmarinaTripleConRetardo(new Posicion (3,1), campoBatalla);
		direccion= new DireccionDerecha();
		fabrica= new AstilleroDeDestructores();
		campoBatalla.insertarAlCampo(unDisparo);
		Nave unDestructor= fabrica.crearNaveEn(new Posicion(0,1), campoBatalla, direccion);
		campoBatalla.insertarAlCampo(unDestructor);
		
		assertEquals(unDestructor.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unDestructor.obtenerComponentes().get(1).getDureza(),1);
		assertEquals(unDestructor.obtenerComponentes().get(2).getDureza(),1);
		
		assertEquals(unDisparo.sigueFuncionando(),true);
		 
		unDestructor.tocaA(unDisparo);

		assertEquals(unDestructor.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unDestructor.obtenerComponentes().get(1).getDureza(),1);		
		assertEquals(unDestructor.obtenerComponentes().get(2).getDureza(),1);
		
		assertEquals(unDisparo.sigueFuncionando(),true); 
		
		campoBatalla.pasoUnTurno();

		assertEquals(unDestructor.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unDestructor.obtenerComponentes().get(1).getDureza(),1);		
		assertEquals(unDestructor.obtenerComponentes().get(2).getDureza(),1);
		
		assertEquals(unDisparo.sigueFuncionando(),true); 
		
		campoBatalla.pasoUnTurno();

		assertEquals(unDestructor.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unDestructor.obtenerComponentes().get(1).getDureza(),1);		
		assertEquals(unDestructor.obtenerComponentes().get(2).getDureza(),1);
		
		assertEquals(unDisparo.sigueFuncionando(),true);
		
		campoBatalla.pasoUnTurno();

		assertEquals(unDestructor.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unDestructor.obtenerComponentes().get(1).getDureza(),1);
		assertEquals(unDestructor.obtenerComponentes().get(2).getDureza(),1);
      
		assertEquals(unDisparo.sigueFuncionando(),false);			
	}
	
	@Test
	public void testMinaTripleABuque(){
		
		campoBatalla= new CampoBatalla();
		unDisparo= new MinaSubmarinaTripleConRetardo(new Posicion (3,1), campoBatalla);
		direccion= new DireccionDerecha();
		fabrica= new AstilleroDeBuques();
		campoBatalla.insertarAlCampo(unDisparo);
		Nave unBuque= fabrica.crearNaveEn(new Posicion(1,1), campoBatalla, direccion);
		campoBatalla.insertarAlCampo(unBuque);
		
		assertEquals(unBuque.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unBuque.obtenerComponentes().get(1).getDureza(),1);
		assertEquals(unBuque.obtenerComponentes().get(2).getDureza(),1);
		assertEquals(unBuque.obtenerComponentes().get(3).getDureza(),1);
		
		assertEquals(unDisparo.sigueFuncionando(),true);
		 
		unBuque.tocaA(unDisparo);

		assertEquals(unBuque.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unBuque.obtenerComponentes().get(1).getDureza(),1);		
		assertEquals(unBuque.obtenerComponentes().get(2).getDureza(),1);
		assertEquals(unBuque.obtenerComponentes().get(3).getDureza(),1);
		
		assertEquals(unDisparo.sigueFuncionando(),true); 
		
		campoBatalla.pasoUnTurno();

		assertEquals(unBuque.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unBuque.obtenerComponentes().get(1).getDureza(),1);		
		assertEquals(unBuque.obtenerComponentes().get(2).getDureza(),1);
		assertEquals(unBuque.obtenerComponentes().get(3).getDureza(),1);
		
		assertEquals(unDisparo.sigueFuncionando(),true); 
		
		campoBatalla.pasoUnTurno();

		assertEquals(unBuque.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unBuque.obtenerComponentes().get(1).getDureza(),1);		
		assertEquals(unBuque.obtenerComponentes().get(2).getDureza(),1);
		assertEquals(unBuque.obtenerComponentes().get(3).getDureza(),1);

		assertEquals(unDisparo.sigueFuncionando(),true);
		
		campoBatalla.pasoUnTurno();

		assertEquals(unBuque.obtenerComponentes().get(0).getDureza(),0);
		assertEquals(unBuque.obtenerComponentes().get(1).getDureza(),0);		
		assertEquals(unBuque.obtenerComponentes().get(2).getDureza(),0);
		assertEquals(unBuque.obtenerComponentes().get(3).getDureza(),0);
		
		assertEquals(unDisparo.sigueFuncionando(),false);
	}
	
	public void testMinaTripleAPortaAvion(){
		
		campoBatalla= new CampoBatalla();
		unDisparo= new MinaSubmarinaTripleConRetardo(new Posicion (3,1), campoBatalla);
		direccion= new DireccionDerecha();
		fabrica= new AstilleroDePortaAviones();
		campoBatalla.insertarAlCampo(unDisparo);
		Nave unPortaAvion= fabrica.crearNaveEn(new Posicion(0,1), campoBatalla, direccion);
		campoBatalla.insertarAlCampo(unPortaAvion);
		
		assertEquals(unPortaAvion.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(1).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(2).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(3).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(4).getDureza(),1);
		
		assertEquals(unDisparo.sigueFuncionando(),true);
		 
		unPortaAvion.tocaA(unDisparo);

		assertEquals(unPortaAvion.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(1).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(2).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(3).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(4).getDureza(),1);
		
		assertEquals(unDisparo.sigueFuncionando(),true); 
		
		campoBatalla.pasoUnTurno();
		
		assertEquals(unPortaAvion.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(1).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(2).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(3).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(4).getDureza(),1);
		
		assertEquals(unDisparo.sigueFuncionando(),true); 
		
		campoBatalla.pasoUnTurno();

		assertEquals(unPortaAvion.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(1).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(2).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(3).getDureza(),1);
		assertEquals(unPortaAvion.obtenerComponentes().get(4).getDureza(),1);
		
		assertEquals(unDisparo.sigueFuncionando(),true);
		
		campoBatalla.pasoUnTurno();

		assertEquals(unPortaAvion.obtenerComponentes().get(0).getDureza(),0);
		assertEquals(unPortaAvion.obtenerComponentes().get(1).getDureza(),0);
		assertEquals(unPortaAvion.obtenerComponentes().get(2).getDureza(),0);
		assertEquals(unPortaAvion.obtenerComponentes().get(3).getDureza(),0);
		assertEquals(unPortaAvion.obtenerComponentes().get(4).getDureza(),1);
		
		assertEquals(unDisparo.sigueFuncionando(),false);		
	}
	
	@Test
	public void testMinaTripleARompeHielos(){
		
		campoBatalla= new CampoBatalla();
		unDisparo= new MinaSubmarinaTripleConRetardo(new Posicion (3,1), campoBatalla);
		direccion= new DireccionDerecha();
		fabrica= new AstilleroDeRompeHielos();
		campoBatalla.insertarAlCampo(unDisparo);
		Nave unRompeHielos= fabrica.crearNaveEn(new Posicion(0,1), campoBatalla, direccion);
		campoBatalla.insertarAlCampo(unRompeHielos);
		
		assertEquals(unRompeHielos.obtenerComponentes().get(0).getDureza(),2);
		assertEquals(unRompeHielos.obtenerComponentes().get(1).getDureza(),2);
		assertEquals(unRompeHielos.obtenerComponentes().get(2).getDureza(),2);
		
		assertEquals(unDisparo.sigueFuncionando(),true);
		 
		unRompeHielos.tocaA(unDisparo);

		assertEquals(unRompeHielos.obtenerComponentes().get(0).getDureza(),2);
		assertEquals(unRompeHielos.obtenerComponentes().get(1).getDureza(),2);		
		assertEquals(unRompeHielos.obtenerComponentes().get(2).getDureza(),2);
		
		assertEquals(unDisparo.sigueFuncionando(),true); 
		
		campoBatalla.pasoUnTurno();

		assertEquals(unRompeHielos.obtenerComponentes().get(0).getDureza(),2);
		assertEquals(unRompeHielos.obtenerComponentes().get(1).getDureza(),2);		
		assertEquals(unRompeHielos.obtenerComponentes().get(2).getDureza(),2);
		
		assertEquals(unDisparo.sigueFuncionando(),true); 
		
		campoBatalla.pasoUnTurno();

		assertEquals(unRompeHielos.obtenerComponentes().get(0).getDureza(),2);
		assertEquals(unRompeHielos.obtenerComponentes().get(1).getDureza(),2);		
		assertEquals(unRompeHielos.obtenerComponentes().get(2).getDureza(),2);
		
		assertEquals(unDisparo.sigueFuncionando(),true);
		
		campoBatalla.pasoUnTurno();

		assertEquals(unRompeHielos.obtenerComponentes().get(0).getDureza(),1);
		assertEquals(unRompeHielos.obtenerComponentes().get(1).getDureza(),1);
		assertEquals(unRompeHielos.obtenerComponentes().get(2).getDureza(),1);
      
		assertEquals(unDisparo.sigueFuncionando(),false);			
	}
}


